package curso.maven.cidades.wicket;

import java.util.HashMap;
import java.util.Map;

import org.apache.wicket.protocol.http.WebApplication;

import curso.maven.cidades.aplicacao.api.AplicacaoCidades;
import curso.maven.cidades.aplicacao.impl.AplicacaoCidadesImpl;
import curso.maven.cidades.negocio.Cidade;
import curso.maven.cidades.negocio.RepositorioCidades;
import curso.maven.cidades.persistencia.memoria.RepositorioCidadesMemoria;
import curso.maven.infra.servico.LocalizadorServico;
import curso.maven.infra.servico.LocalizadorServicoMapa;

/**
 * Application object for your web application. If you want to run this
 * application without deploying, run the Start class.
 * 
 * @see curso.maven.cidades.wicket.Start#main(String[])
 */
public class WicketApplication extends WebApplication {
	/**
	 * @see org.apache.wicket.Application#getHomePage()
	 */
	@Override
	public Class<HomePage> getHomePage() {
		return HomePage.class;
	}

	/**
	 * @see org.apache.wicket.Application#init()
	 */
	@Override
	public void init() {
		super.init();
		
		configurarServicos();
	}

	private void configurarServicos() {
		RepositorioCidades repositorioCidades = new RepositorioCidadesMemoria(
			new Cidade[] {
				new Cidade("01", "Brasilia", "DF"),
				new Cidade("02", "Recife", "PE"),
				new Cidade("03", "Caruaru", "PE"),
				new Cidade("04", "Rio de Janeiro", "RJ"),
				new Cidade("05", "Belo Horizonte", "MG"),
				new Cidade("06", "Sao Paulo", "SP")
			}
		);
		AplicacaoCidades aplicacaoCidades = new AplicacaoCidadesImpl(repositorioCidades);

		Map<String, Object> servicos = new HashMap<String, Object>();
		servicos.put("AplicacaoCidades", aplicacaoCidades);
		LocalizadorServicoMapa localizadorServico = new LocalizadorServicoMapa(servicos);
		localizadorServico.registrarInstanciaPadrao();
	}
	
	public static WicketApplication get() {
		return (WicketApplication) WebApplication.get();
	}
	
	public AplicacaoCidades getAplicacaoCidades() {
		LocalizadorServico localizadorServico = LocalizadorServico.instanciaPadrao();
		AplicacaoCidades aplicacaoCidades = localizadorServico.servicoPorTipo(AplicacaoCidades.class);
		return aplicacaoCidades;
	}
}
